﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Unimaq.FacturaDBS_Spring.LogicaNegocio.Comparer;

namespace Unimaq.FacturaDBS_Spring.LogicaNegocio.CentroCosto.UC
{
    public class DetalleFactura_UCRepuestosBLL
    {
        #region Metodos Auxiliares
        public string getTipoComprobante(string tipoDocumento)
        {
            string result = string.Empty;

            switch (tipoDocumento.Trim())
            {
                case "FA":
                case "fa":
                    result = "FA";
                    break;
                case "BO":
                case "bo":
                    result = "BV";
                    break;
                case "NA":
                case "na":
                    result = "NC";
                    break;
                case "NC":
                case "nc":
                    result = "ND";
                    break;
            }

            return result;
        }

        public string convertMoneda(string value)
        {
            string result = string.Empty;

            switch (value.Trim())
            {
                case "D":
                case "d":
                    result = "EX";
                    break;
                case "N":
                case "n":
                    result = "LO";
                    break;
            }

            return result;
        }

        public string getSucursal(decimal value)
        {
            string result = string.Empty;

            int val = Convert.ToInt32(value);

            switch (val)
            {
                case 0:
                case 1:
                case 2:
                    result = "LIMA";
                    break;
                case 18:
                case 20:
                    result = "HYO";
                    break;
                case 30:
                    result = "PIUR";
                    break;
                case 40:
                    result = "LAMB";
                    break;
                case 45:
                    result = "CAJA";
                    break;
                case 55:
                    result = "TRUJ";
                    break;
                case 60:
                    result = "AREQ";
                    break;
                case 61:
                    result = "ILO";
                    break;
                case 65:
                    result = "CUZC";
                    break;
                default:
                    result = string.Empty;
                    break;
            }

            return result;
        }
        #endregion

        #region Facturas Repuestos (RP XXXXXXXXX)
		        
        public List<Entidades.CentroCosto.UC.DBS_Head_Detail_Factura_UCRepuestos> ListarFacturaRepuestos()
        {
            ADO.DetalleFactura_UCRepuestos_ADO detalleFacturaADO = new ADO.DetalleFactura_UCRepuestos_ADO();

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto()) 
            {
                return detalleFacturaADO.ListarFacturasRepuestos(ctx);
            }
        }

        public List<Entidades.CentroCosto.UC.DBS_Head_Detail_Factura_UCRepuestos> ListarFacturaRepuestos_AS400(DateTime fechaEmisionInicio, DateTime fechaEmisionFin)
        {
            ADO.DetalleFactura_UCRepuestos_ADO detalleFacturaADO = new ADO.DetalleFactura_UCRepuestos_ADO();

            using (Util.ContextoDBAS400 ctx = Util.ContextoDBAS400.GetContexto())
            {
                return detalleFacturaADO.ListarFacturasRepuestosAS400(ctx, fechaEmisionInicio, fechaEmisionFin);
            }
        }

        public void CargarDetalle_LineAD_UCRepuestos(List<Entidades.CentroCosto.UC.DBS_Head_Detail_Factura_UCRepuestos> lista)
        {
            DBS_LineAD_ObjectDLL dbsLineAD_DLL = new DBS_LineAD_ObjectDLL();
            
            foreach (Entidades.CentroCosto.UC.DBS_Head_Detail_Factura_UCRepuestos l in lista)
            {
                dbsLineAD_DLL.Convertir(l);
            }
        }

        public List<Entidades.Spring.FacturaSpring_Detalle> ToSpring_Detalle(List<Entidades.CentroCosto.UC.DBS_Head_Detail_Factura_UCRepuestos> lista)
        {
            List<Entidades.Spring.FacturaSpring_Detalle> result = new List<Entidades.Spring.FacturaSpring_Detalle>();

            List<Entidades.CentroCosto.UC.DBS_Head_Detail_Factura_UCRepuestos>  listaOrdenada 
                = lista.OrderBy(x => x.Numori).ThenBy(x => x.Numsec).ToList();


            string qNumori = string.Empty;
            int lineaValue = 0;

            foreach (Entidades.CentroCosto.UC.DBS_Head_Detail_Factura_UCRepuestos l in lista)
            {
                Entidades.Spring.FacturaSpring_Detalle detalle = new Entidades.Spring.FacturaSpring_Detalle();

                if (qNumori.Trim() != l.Numori.Trim())
                {
                    lineaValue = 1;
                }

                detalle.TipoComprobante = getTipoComprobante(l.Suntip.Trim());
                detalle.Seriecomprobante = l.Sunpre.ToString().Trim();
                detalle.NumeroComprobante = l.Sunnum.ToString().Trim();
                detalle.Linea = lineaValue.ToString();
                detalle.TipoComponente = "A";
                detalle.Componente = l.Encode.Trim();
                detalle.Nombre = string.Format("{0} {1}", l.DetalleLineAD.NroParte.Trim(), l.DetalleLineAD.Descripcion.Trim());
                detalle.Cantidad = l.DetalleLineAD.Ped;
                detalle.Moneda = convertMoneda(l.Moneda);
                detalle.Tipocambio = l.Tipcam;
                detalle.Preciounitario = l.DetalleLineAD.ValorVentaNetoUnitario;
                detalle.Montoafecto = (l.DetalleLineAD.Ped * l.DetalleLineAD.ValorVentaNetoUnitario);
                detalle.ClasificadorMovimiento = "999";
                detalle.UnidadOrganizacional = "999";
                detalle.ConceptoGasto = "999";
                detalle.CentroCosto = l.Cencos;

                result.Add(detalle);
                qNumori = l.Numori.Trim();
                lineaValue++;
            }

            return result;
        }

        public List<Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase> ToSpringDetalle(List<Entidades.CentroCosto.UC.DBS_Head_Detail_Factura_UCRepuestos> lista)
        {
            List<Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase> result = new List<Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase>();

            string qNumori = string.Empty;
            int lineaValue = 0;

            foreach (Entidades.CentroCosto.UC.DBS_Head_Detail_Factura_UCRepuestos l in lista)
            {
                Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase detalle = new Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase();

                if (qNumori.Trim() != l.Numori.Trim())
                {
                    lineaValue = 1;
                }

                detalle.TipoComprobante = getTipoComprobante(l.Suntip.Trim());
                detalle.SerieComprobante = l.Sunpre.ToString().Trim();
                detalle.NumeroComprobante = l.Sunnum.ToString().Trim();
                detalle.Linea = lineaValue;
                detalle.TipoComponente = "C";
                detalle.Componente = l.Encode.Trim().Substring(0,4);
                detalle.Nombre = string.Format("{0} {1}", l.DetalleLineAD.NroParte.Trim(), l.DetalleLineAD.Descripcion.Trim());
                detalle.Sucursal = getSucursal(l.Ofic);
                detalle.Cantidad = l.DetalleLineAD.Ped;
                detalle.Moneda = convertMoneda(l.Moneda);
                detalle.TipoCambio = l.Tipcam; 
                //MODIFICAR EN BV COGER VALOR VENTA
                detalle.PrecioUnitario = l.Suntip.Trim() == "BO" ? Decimal.Round(l.DetalleLineAD.ValorVentaNetoUnitario/1.18m,2) :  l.DetalleLineAD.ValorVentaNetoUnitario;
                detalle.MontoAfecto = l.Suntip.Trim() == "BO" ? l.DetalleLineAD.Ped * (Decimal.Round(l.DetalleLineAD.ValorVentaNetoUnitario / 1.18m, 2)) : l.DetalleLineAD.Ped * l.DetalleLineAD.ValorVentaNetoUnitario;
                detalle.MontoImpuestoVentas = l.Suntip.Trim() == "BO" ? Decimal.Round((l.DetalleLineAD.Ped * (Decimal.Round(l.DetalleLineAD.ValorVentaNetoUnitario / 1.18m, 2))) * 0.18m, 2) : Decimal.Round((l.DetalleLineAD.Ped * l.DetalleLineAD.ValorVentaNetoUnitario) * 0.18m , 2);
                detalle.ClasificadorMovimiento = "999";
                detalle.UnidadOrganizacional = "999";
                detalle.ConceptoGasto = "999";
                detalle.EstadoCarga = "PE";
                detalle.Estado = "PE";
                detalle.CentroCosto = l.Cencos;
                detalle.FechaCarga = DateTime.Now;
                detalle.UsuarioResponsableCarga = "MISESF";
                detalle.Compania = "06000000";

                result.Add(detalle);
                qNumori = l.Numori.Trim();
                lineaValue++;
            }

            return result;
        }
 
	    #endregion 
   
        #region Nota de Credito Repuestos (RPD XXXXXXXX)
		public List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> ListarNotaCreditoRepuestos()
        {
            ADO.DetalleFactura_UCRepuestos_ADO detalleFacturaDAO = new ADO.DetalleFactura_UCRepuestos_ADO();

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                return detalleFacturaDAO.ListarNotaCreditoRepuestos(ctx);
            }
        }

        public List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> ListarNotaCreditoRepuestos_AS400(DateTime fechaEmisionInicio, DateTime fechaEmisionFin)
        {
            ADO.DetalleFactura_UCRepuestos_ADO detalleFacturaDAO = new ADO.DetalleFactura_UCRepuestos_ADO();

            using (Util.ContextoDBAS400 ctx = Util.ContextoDBAS400.GetContexto())
            {
                return detalleFacturaDAO.ListarNotaCreditoRepuestosAS400(ctx, fechaEmisionInicio, fechaEmisionFin);
            }
        }

        public List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> GetFilasNoDuplicados(List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> lista)
        {
            return lista.Distinct(new DBS_NotaCredito_Repuestos_Comparer()).ToList();
        }

        public Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos UnirRegistro(List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> lista)
        {
            Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos result = null;

            if (lista.Count > 0)
            {
                result = new Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos()
                {
                    Numori = lista[0].Numori,
                    Suntip = lista[0].Suntip,
                    Sunpre = lista[0].Sunpre,
                    Sunnum = lista[0].Sunnum,
                    Cencos = lista[0].Cencos,
                    Tipform = lista[0].Tipform,
                    Valaf16 = lista[0].Valaf16,
                    Moneda = lista[0].Moneda,
                    Tipcam = lista[0].Tipcam,
                    DetNumori = lista[0].DetNumori,
                    Anodoc = lista[0].Anodoc,
                    Tipdoc = lista[0].Tipdoc,
                    Numsec = lista[0].Numsec,
                    Accion = lista[0].Accion,
                    Importe = lista[0].Importe,
                    DetCencos = lista[0].Cencos,
                    Ecode1 = lista[0].Ecode1,
                    Ecode2 = lista[0].Ecode2,
                    Ecode3 = lista[0].Ecode3,
                    Encode = lista[0].Encode,
                    Fill01 = lista[0].Fill01
                };

                foreach (Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos hdRptos in lista)
                {
                    result.Linead = string.Format("{0} {1}", result.Linead, hdRptos.Linead.Trim());
                }
            }

            return result;
        }

        public List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> GetFilas_Agrupadas(List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> FilasNoDuplicadas, List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> lista)
        {
            List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> result = new List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos>();

            foreach (Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos m in FilasNoDuplicadas)
            {
                List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> ListSelect =
                    lista.Where(x => x.Numori.Trim() == m.Numori.Trim() && x.Suntip == m.Suntip && x.Sunpre == m.Sunpre && x.Sunnum == m.Sunnum).ToList();

                Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos hd = UnirRegistro(ListSelect);

                if (hd != null)
                {
                    result.Add(hd);
                }
            }

            return result;
        }

        public List<Entidades.Spring.FacturaSpring_Detalle> ToSpring_Detalle(List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> lista)
        {
            List<Entidades.Spring.FacturaSpring_Detalle> result = new List<Entidades.Spring.FacturaSpring_Detalle>();

            foreach (Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos l in lista)
            {
                Entidades.Spring.FacturaSpring_Detalle detalle = new Entidades.Spring.FacturaSpring_Detalle();

                detalle.TipoComprobante = getTipoComprobante(l.Suntip.Trim());
                detalle.Seriecomprobante = l.Sunpre.ToString().Trim();
                detalle.NumeroComprobante = l.Sunnum.ToString().Trim();
                detalle.Linea = "1";
                detalle.Componente = !string.IsNullOrWhiteSpace(l.Ecode1) ? l.Ecode1.Trim() : !string.IsNullOrWhiteSpace(l.Ecode2) ? l.Ecode2.Trim() : !string.IsNullOrWhiteSpace(l.Ecode3) ? l.Ecode3.Trim() : string.Empty;
                detalle.TipoComponente = "C";
                detalle.Nombre = l.Linead.Trim();
                detalle.Moneda = convertMoneda(l.Moneda);
                detalle.Tipocambio = l.Tipcam;
                detalle.Preciounitario = l.Valaf16;
                detalle.Montoafecto = l.Valaf16;
                detalle.ClasificadorMovimiento = "999";
                detalle.UnidadOrganizacional = "999";
                detalle.ConceptoGasto = "999";
                detalle.CentroCosto = l.Cencos;

                result.Add(detalle);
            }

            return result;
        }

        public List<Entidades.Spring.FacturaSpring_Detalle> ToSpring_Detalle2(List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> lista)
        {
            List<Entidades.Spring.FacturaSpring_Detalle> result = new List<Entidades.Spring.FacturaSpring_Detalle>();

            string qNumori = string.Empty;
            int lineaValue = 0;

            foreach (Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos l in lista)
            {
                Entidades.Spring.FacturaSpring_Detalle detalle = new Entidades.Spring.FacturaSpring_Detalle();

                if (qNumori.Trim() != l.Numori.Trim())
                {
                    lineaValue = 1;
                }

                detalle.TipoComprobante = getTipoComprobante(l.Suntip.Trim());
                detalle.Seriecomprobante = l.Sunpre.ToString().Trim();
                detalle.NumeroComprobante = l.Sunnum.ToString().Trim();
                detalle.Linea = lineaValue.ToString();
                detalle.Componente = !string.IsNullOrWhiteSpace(l.Ecode1) ? l.Ecode1.Trim() : !string.IsNullOrWhiteSpace(l.Ecode2) ? l.Ecode2.Trim() : !string.IsNullOrWhiteSpace(l.Ecode3) ? l.Ecode3.Trim() : string.Empty;
                detalle.TipoComponente = "C";
                detalle.Nombre = l.Linead.Trim();
                detalle.Moneda = convertMoneda(l.Moneda);
                detalle.Tipocambio = l.Tipcam;
                detalle.Preciounitario = lineaValue == 1 ? l.Valaf16 : new decimal(0.00001);
                detalle.Montoafecto = lineaValue == 1 ? l.Valaf16 : new decimal(0.00001);
                detalle.ClasificadorMovimiento = "999";
                detalle.UnidadOrganizacional = "999";
                detalle.ConceptoGasto = "999";
                detalle.CentroCosto = l.Cencos;

                result.Add(detalle);
                qNumori = l.Numori.Trim();
                lineaValue++;
            }

            return result;
        }

        public List<Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase> ToSpringDetalle(List<Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos> lista)
        {
            List<Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase> result = new List<Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase>();

            string qNumori = string.Empty;
            //string qSuntip = string.Empty;
            //decimal qSunPre = -1;
            //decimal qSunNum = -1;
            int lineaValue = 0;

            foreach (Entidades.CentroCosto.UC.DBS_Head_Detail_NotaCredito_UCRepuestos l in lista)
            {
                Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase detalle = new Entidades.Spring.CM_CO_ComprobanteDetalle_Interfase();

                if (qNumori.Trim() != l.Numori.Trim())
                {
                    lineaValue = 1;
                }

                detalle.TipoComprobante = getTipoComprobante(l.Suntip.Trim());
                detalle.SerieComprobante = l.Sunpre.ToString().Trim();
                detalle.NumeroComprobante = l.Sunnum.ToString().Trim();
                detalle.Linea = lineaValue;
                detalle.Componente = !string.IsNullOrWhiteSpace(l.Ecode1) ? l.Ecode1.Trim().Substring(0, 4) : !string.IsNullOrWhiteSpace(l.Ecode2) ? l.Ecode2.Trim().Substring(0, 4) : !string.IsNullOrWhiteSpace(l.Ecode3) ? l.Ecode3.Trim().Substring(0, 4) : string.Empty;
                detalle.TipoComponente = "C";
                detalle.Cantidad = 1;
                detalle.Nombre = l.Linead.Trim();
                detalle.Sucursal = getSucursal(l.Ofic);
                detalle.Moneda = convertMoneda(l.Moneda);
                detalle.TipoCambio = l.Tipcam;
                detalle.PrecioUnitario = lineaValue == 1 ? l.Valaf16 : new decimal(0);
                detalle.MontoAfecto = lineaValue == 1 ? l.Valaf16 : new decimal(0);
                detalle.MontoImpuestoVentas = lineaValue == 1 ? l.Impor16 : new decimal(0);
                detalle.ClasificadorMovimiento = "999";
                detalle.UnidadOrganizacional = "999";
                detalle.ConceptoGasto = "999";
                detalle.EstadoCarga = "PE";
                detalle.Estado = "PE";
                detalle.CentroCosto = l.Cencos;
                detalle.FechaCarga = DateTime.Now;
                detalle.UsuarioResponsableCarga = "MISESF";
                detalle.Compania = "06000000";

                result.Add(detalle);

                qNumori = l.Numori.Trim();
                //qSuntip = l.Suntip.Trim();
                //qSunPre = l.Sunpre;
                //qSunNum = l.Sunnum;
                lineaValue++;
            }

            return result;
        }
 
	    #endregion    
    
        public void exportarArchivo(string NombreArchivo, List<Entidades.Spring.FacturaSpring_Detalle> gridBound, string tipoArchivo)
        {
            StreamWriter file = new StreamWriter(NombreArchivo, false);
            string line = string.Empty;

            foreach (Entidades.Spring.FacturaSpring_Detalle g in gridBound)
            {
                switch (tipoArchivo)
                {
                    case "TXT":
                        line = string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}\t{9}\t{10}\t{11}\t{12}\t{13}\t{14}\t{15}\t{16}\t{17}\t{18}",
                            g.TipoComprobante, g.Seriecomprobante, g.NumeroComprobante, g.Linea, g.TipoComponente, g.Componente,
                            g.Nombre, g.Cantidad, g.Moneda, g.Tipocambio.ToString(), g.Preciounitario.ToString(), g.Montoafecto.ToString(),
                            g.Montonoafecto.ToString(), g.Montoimpuestoventas.ToString(), g.ClasificadorMovimiento, g.UnidadOrganizacional,
                            g.ConceptoGasto, g.CentroCosto, g.Sucursal);
                        break;
                }

                file.WriteLine(line);
            }

            file.Close();
        }
    }
}
